
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>



#include "Definicion_de_constantes.h"
#include "Variables_Globales.h"
#include "Funciones_de_Strings.h"
#include "Funciones_de_Log.h"
#include "Funciones_de_Sockets.h"
#include "Funciones_Enviar_Recibir.h"
#include "Funciones_de_Listas.h"
#include "Primitivas_de_Array.h"





char* getCHS()
{
char * sBuffer;

sBuffer = malloc(500);
memset(sBuffer, '\0', sizeof(sBuffer));

sprintf(sBuffer ,"Cantidad de Cilindros: %i \nCantidad de Cabezales: %i \nCantidad de Sectores por pista: %i \r\n",iCC_cantidad, iHH_cantidad, iSS_cantidad);

printf("%s",sBuffer);

return sBuffer;
}




 void get_sectores(int *iSector1, int *iSector2, struct DiscoConocido * pDiscoAutilizar, char* sDescriptorID_dePedido , char * sSocket_dePedido)
 {
 struct DiscoConocido * pDisco;
 char sDescriptorID[20];
 char *sAux;
 char ElsSocketDebeCerrarse;

	if(pDiscoAutilizar == NULL)		/*si recibe null busca un disco listo*/
		{	
		pDisco = BuscarDiscoListo();		//busca un disco por opciones: (en este caso el primer disco "LISTO" que encuentre)

            	CambiaPosicionDelNodo(&pDisco);
                
		ElsSocketDebeCerrarse = NO_CERRAR;
		}
	else
		{
		pDisco = pDiscoAutilizar;
	
		ElsSocketDebeCerrarse = CERRAR_SOCKET;
		}

	
	EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA, sDescriptorID_dePedido , sDescriptorID, GET_SECTORES, GENERAR_NUEVO, -1);
	EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA, sSocket_dePedido , sDescriptorID, GET_SECTORES, USAR_ANTERIOR, -1);
	if(iSector1 == NULL)
		sAux = NULL;
	else
		{
		sAux = malloc(20);
		intacad(*iSector1, sAux);
		}
	EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA, sAux , sDescriptorID, GET_SECTORES, USAR_ANTERIOR, -1);
	if(sAux != NULL)
		free(sAux);	
	
	if(iSector2 == NULL)
		sAux = NULL;
	else
		{
		sAux = malloc(20);
		intacad(*iSector2, sAux);
		}
	EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA, sAux , sDescriptorID, GET_SECTORES, USAR_ANTERIOR, -1);
	if(sAux != NULL)
		free(sAux);	   

	EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA, NULL , sDescriptorID, ElsSocketDebeCerrarse, USAR_ANTERIOR, -1);

 
 }

 void putSectores(char * sBuffer, char* sDescriptorID_dePedido , char * sSocket_dePedido)
 {
  struct DiscoConocido * pDisco;
  struct Pedido_PutSectores * pPedidoPut;

char sDescriptorID[20];


 pPedidoPut = malloc(sizeof(struct Pedido_PutSectores) );
 pPedidoPut->Sgt = NULL;
 pPedidoPut->Ant = NULL;

 strcpy(pPedidoPut->sDescriptorID_delPedido , sDescriptorID_dePedido);

 pPedidoPut->iDiscosAEspejar = iCantidadDeDAConectados;

 AgregarACola_Put(&pPedidoPut );



 pDisco = ListaDiscos;
			while(pDisco != NULL)		/*PRIMERO SE LE ENVIA EL PEDIDO  A LOS DISCOS QUE ESTAN LEYENDO PARA SINCRONIZAR*/
				{
				if(pDisco->Estado == SINCRONIZANDO_LEYENDO)
					{
					EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA, sDescriptorID_dePedido , sDescriptorID, PUT_SECTORES, GENERAR_NUEVO, -1);
					EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA, sSocket_dePedido , sDescriptorID, PUT_SECTORES, USAR_ANTERIOR, -1);
					EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA , sBuffer , sDescriptorID, PUT_SECTORES , USAR_ANTERIOR, 1024 + 4 /*sizeof(int)*/ + 4 /*sizeof(int)*/);
					}
				pDisco = pDisco->Sgt;
				}
 
pDisco = ListaDiscos;
			while(pDisco != NULL)		/*en segundo lugar SE LE ENVIA EL PEDIDO  A LOS DISCOS QUE ESTAN LISTOS*/
				{
				if(pDisco->Estado == LISTO)
					{
					EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA, sDescriptorID_dePedido , sDescriptorID, PUT_SECTORES, GENERAR_NUEVO, -1);
					EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA, sSocket_dePedido , sDescriptorID, PUT_SECTORES, USAR_ANTERIOR, -1);
					EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA , sBuffer , sDescriptorID, PUT_SECTORES , USAR_ANTERIOR, 1024 + 4 /*sizeof(int)*/ + 4 /*sizeof(int)*/);
					
					}				
				pDisco = pDisco->Sgt;
				}

pDisco = ListaDiscos;
			while(pDisco != NULL)		/*Y en TERCER lugar SE LE ENVIA EL PEDIDO  A LOS DISCOS QUE ESTAN SIENDO SINCRONIZADOS*/
				{
				if(pDisco->Estado == SINCRONIZANDO)
					{
					EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA, sDescriptorID_dePedido , sDescriptorID, PUT_SECTORES, GENERAR_NUEVO, -1);
					EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA, sSocket_dePedido , sDescriptorID, PUT_SECTORES, USAR_ANTERIOR, -1);
					EnviarCadenaEnIPCIRC(pDisco->iSocketArrayParaHDA , sBuffer , sDescriptorID, PUT_SECTORES , USAR_ANTERIOR, 1024 + 4 /*sizeof(int)*/ + 4 /*sizeof(int)*/);
					
					}					
				pDisco = pDisco->Sgt;
				}
 

 }